<?php


class Solution {

    /**
     * @param Integer[] $nums
     * @param Integer $limit
     * @return Integer
     */
    function longestSubarray($nums, $limit) {
        $min = 0;
        $max = 0;
        $minIndex = 0;// 滑动窗口最小值的位置
        $maxIndex = 0;// 滑动窗口最大值的位置
        $i = 0;
        $number = 1; // 窗口大小
        $size = count($nums);
        $j =0;
        while($i < $size - 1 && $j < $size) {
            $start = $i; //滑动窗口左边的值
            $j = $i + 1;
            // 符合题意要求 绝对值之差小于limit 进入循环，不断向后扩大滑动窗口大小
            if(abs($nums[$j] - $nums[$i]) <= $limit) {
                // 符号条件更新位置
                if($nums[$j] > $nums[$i]) {
                    $maxIndex = $j;
                    $minIndex = $i;
                }else{
                    $maxIndex = $i;
                    $minIndex = $j;
                }
                $max = max($nums[$j], $nums[$i]);
                $min = min($nums[$j], $nums[$i]);
                // 当前滑动窗口的最大 最小 之差小于 limit
                while(abs($max - $min) <= $limit  && $j < $size){
                    $j++; // 向后移动
                    // 如果超出就停止循环
                    // if($j >= $size) break;
                    // 如果后面的元素，大于当前滑动窗口最大值
                    if($nums[$j] >= $max) {
                        // 最大值-最小值 不符合要求 ，滑动窗口左边收缩
                        if($nums[$j] - $min > $limit) {
                            $i = $minIndex + 1;// 移动i
                        }else{
                            // 并且符合要求，那么就更新最大值的位置
                            $maxIndex = $j;
                        }
                    }
                    // 如果后面的元素，小于当前滑动窗口最小值
                    if($nums[$j] <= $min) {
                        if($max - $nums[$j] > $limit) {
                            // 不符合要求，滑动窗口收缩
                            $i = $maxIndex + 1;
                        }else{
                            // 符合要求，更新最小值的位置
                            $minIndex = $j;
                        }
                    }
                    // 得到当前滑动窗口的最大值 和 最小值
                    $max = max($nums[$j], $max);
                    $min = min($nums[$j], $min);
                }
                // 记录窗口位置
                $number = max($number , $j - $start);
            }else{
                // 不符合的直接跳过
                $i++;
            }
        }
        return $number;

    }

}


?>